package class202205.demo15.demo12;

import java.util.Arrays;

public class MyStack {
    public int[] elem;
    public int usedSize;

    public MyStack(){
        this.elem = new int[5];
    }

    /**
     * 入栈
     * @param val
     */
    public void push(int val){
        if (isFull()){
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[this.usedSize++] = val;
    }

    /**
     * 判断当前栈是否为满
     * @return
     */
    public boolean isFull(){
        return usedSize == elem.length;
    }

    /**
     * 出栈
     * @return
     */
    public int pop(){
        if (empty()){
            throw new RuntimeException("栈为空！");//就不自己定义异常了，不规范
        }
        int ret = elem[usedSize-1];//先存栈顶元素
        //如果是引用类型  则  elem[usedSize-1] 需要置为空   因为不的话  一直在引用对象  null的化就会回收
        usedSize--;//推出栈顶  下次放到usedSize位置相当于覆盖
        return ret;
    }

    /**
     * 判空
     * @return
     */
    public boolean empty(){
        return usedSize == 0;
    }

    /**
     * 获取栈顶元素  不删除
     * @return
     */
    public int peek(){
        if (empty()){
            throw new RuntimeException("栈为空！");//就不自己定义异常了，不规范
        }
        return elem[usedSize-1];
    }

    /**
     * 获取栈中有效元素个数
     * @return
     */
    public int getUsedSize(){
        return usedSize;
    }
}
